/*----------------------------------------------------------------------------------------
*
*  Copyright 2019, Gao Hai Hui, <fromzeropoint@126.com>.  All rights reserved.
*  https://gitee.com/helloworldghh/xos_cat.git
*  Use of this source code is governed by a MIT license
*  that can be found in the License file.
*
----------------------------------------------------------------------------------------*/
#include "../import/head.h"
#include "../tools/tools.h"
#include "../impl/head.h"
#include "config.h"

namespace xos_cat
{

    //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
    // 

    static config* config_ptr = 0;

    //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
    // 

    config::config()
    {
        // heart
        heart_check_interval_ms = 1000;
        sys_heart_interval_ms = 1000;

        // thread
        max_worker_thread_num = 0;
        max_slow_thread_num = 10;

        // config obj
        m_pConfigProp = 0;
        m_pConfig = 0;

        // auto quit
        m_b_auto_quit = false;
    }

    config::~config()
    {
        xos_stl::release_interface( m_pConfig );
        m_pConfigProp = 0;
        m_module_list.clear();
    }

    //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
    // 

    config * config::get()
    {
        return config_ptr;
    }

    int config::init()
    {
        int ret = 0;

        if( 0 == ret )
        {
            ret = xos_stl::init_obj( config_ptr );
        }

        if( 0 == ret )
        {
            ret = config::get()->load( "xos_cat.xml" );
        }

        return ret;
    }

    int config::term()
    {
        int ret = 0;
        ret = xos_stl::term_obj( config_ptr );
        return ret;
    }

    //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
    // proc

    int config::get_config()
    {
        int ret = 0;

        {
            xos_box::i_str_property* p = m_pConfigProp->str_prop( "heart" );
            heart_check_interval_ms = p->i32( "heart_check_interval_ms" );
            sys_heart_interval_ms = p->i32( "sys_heart_interval_ms" );
        }
        {
            xos_box::i_str_property* p = m_pConfigProp->str_prop( "thread" );
            max_worker_thread_num = p->i32( "max_worker_thread_num" );
            max_slow_thread_num = p->i32( "max_slow_thread_num" );
        }
        {
            xos_box::i_list* p = m_pConfigProp->list( "modules" );
            p->reset();
            xos::i_release* pR = 0;
            while( (pR = p->next()) )
            {
                xos_box::i_variant* pV = static_cast<xos_box::i_variant*>(pR);
                const char* lpStr = pV->str();
                m_module_list.push_back( lpStr );
            }
        }
        {
            int n_quit = m_pConfigProp->i32( "auto_quit" );
            m_b_auto_quit = (0==n_quit?false:true);
        }

        return ret;
    }

    int config::load( const char* lpszFile )
    {
        int ret = 0;

        if( 0 == ret )
        {
            char szFile[4096] = { 0 };
            tools::full_path( szFile, sizeof( szFile ), lpszFile );
            ret = mgr::container()->xml()->load_xml( szFile, 0, 0, &m_pConfig );
        }

        if( 0 == ret )
        {
            m_pConfigProp = m_pConfig->str_prop( 0 );
        }

        if( 0 == ret )
        {
            ret = get_config();
        }

        return ret;
    }

} // xos_cat
